TimesTen問合せオプティマイザは、索引を使用して問合せの実行を高速化します。オプティマイザでは、SELECT、INSERT SELECT、UPDATEまたはDELETE文を準備する際に、既存の索引を使用して、あるいは必要に応じて一時索引を作成して、最適な実行計画を生成します。
索引とは、表の行の位置を示すキーのマップです。TimesTenシステムから最大のパフォーマンスを引き出すには、索引を戦略的に使用することが必須になります。
TimesTenでは、次の2種類の索引付けテクニックを使用します。
等価検索で高速参照を実現するために、主キーが表に定義されている場合、ハッシュ索引が自動的に作成されます。Tツリー索引は、CREATE INDEX文によって作成され、等価と範囲(より大きい/等しい、より小さい/等しいなど)を含む参照に使用されます。一意列制約および外部キー制約を施行するために、索引が自動的に作成されます。状況によっては、オプティマイザが表に一時索引を作成して、より効率的な結合を実行する場合もあります。
通常、完全一致参照と等価結合については、ハッシュ索引の方がTツリー索引より高速です。ただし、範囲またはキーの接頭辞を含む参照ではハッシュ索引を使用できません。さらに、ハッシュ索引ではTツリー索引よりも多くの領域が必要です。
すべてのハッシュ索引は一意です。これは表の各行が、1つまたは複数の索引列に一意の値を持つことを意味します。Tツリー索引は一意として指定できます。すべてのコンポーネント列でNULL値が許可されないハッシュ索引とは異なり、一意Tのツリー索引はNULL値可能列に対して作成できます。SQL標準に準拠して、複数のNULL値が一意のTツリー索引で許可されます。
1つ以上の列にPRIMARY KEYまたはUNIQUE HASHオプションを指定して、CREATE TABLE文で表を作成すると、ハッシュ索引がTimesTenによって自動的に作成されます。主キー列はNULLにできません。また、ハッシュ索引は各表に1つのみ許可されます。
CREATE TABLE文のPAGESパラメータで、表のハッシュ索引に割り当てるバケット数を指定します。ハッシュ索引のバケットが少ないと、ハッシュ衝突が多くなります。バケットが多くなると衝突は少なくなりますが、メモリーを浪費する可能性があります。ハッシュ・キーの比較は高速処理のため、ハッシュ衝突が少ない場合は、パフォーマンスに重大な影響が及ぶことはありません。
メイン・メモリー・データ管理システムは、メモリー要件を軽減することと、コード・パスおよびフットプリントを縮小することを目的に設計されています。従来のディスク・ベースのRDBMSでは、B+ツリー索引を使用して、データ・ファイルの索引参照に必要なディスクI/Oの量を削減します。TimesTenでは、メイン・メモリー・アクセスの最適化を行うTツリー索引を使用します。Tツリー索引はBツリー索引より経済的で、必要とするメモリー領域とCPUサイクルは少なくなります。
Tツリーは、各索引ノードの左端の値のみを保持することで、領域要件を軽減します。その他の値には、データ行自体にアクセスすることでアクセスできます。索引ツリー構造はすべてメモリー常駐のため、TツリーにディスクI/Oはありません。Tツリーでは不要な計算を排除し、可能なかぎりポインタ走査を利用することで、コードの複雑さを軽減し、コード・パス長を短縮します。
CREATE INDEX文を使用して、表にTツリー索引を作成します。Tツリー索引は、表への行の挿入前または挿入後のいずれかで作成できます。各CREATE INDEX文では、索引キーとして使用する列を1つ以上記述します。複数の列を記述した場合、リスト内の最初の列が、索引キーのソート順序で最優先されます。
TimesTenではTツリー索引を作成して、外部キー制約に対して一意列制約を施行します。
図6.2に、索引キーとして指定された列に、値58を含む行の範囲を検索するために使用される検索パスを示します(この列は唯一の索引キーであるか、またはソート順序の先頭にあります)。
図6.2 Tツリー・ノード
図6.2に示すように、TツリーはTツリー・ノードのグループで構成されます。各ノードは64個の索引キーのグループで構成され、各キーは個別の表の行を示しています。Tツリー・ノードは、検索パスの最初のノードであるルート・ノードで開始されます。その他のノードは、高い方の値が右に分岐し、低い方の値が左に分岐するように、ルート・ノードから均等に分散されます。このように、Tツリー検索アルゴリズムでは、2度比較するのみで、検索中の値が現在のノードに存在するのか、メモリー内の他の場所に存在するのかがわかります。すべての新しい索引ノードのポインタ間接化によって、その検索領域は2つに分けられます。